/* Trim method for string */
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, ""); 
};



function validate(form) 
{
    var valid = true;     
		//return true;
	// call any user's functionality before validation

	// get values from tinyMCE
	try {
		tinyMCE.triggerSave();
	} catch (e) {
	}

  var elements = new Array();
	if(form.tagName.toString().toLowerCase() == 'form') {
		var elements = form.getElementsByTagName('*');
	} else {
		elements[0] = form;
		while((form.tagName.toString().toLowerCase() != 'form') && (form.parentNode != null)) {
			form = form.parentNode;
		}
		if(form.tagName.toString().toLowerCase() != 'form') {
			elements = new Array();
		}
	}
	cont = 0;
	/* Iterate through the form fields */
	for(var eCounter = 0; eCounter < elements.length; eCounter++) {
		var element = elements[eCounter];

		if(element.type != "" && String(element.type) != "undefined" && String(element.type) != "submit"  && String(element.type) != "button")
		{

		/* Look for validation data */
		var alt = element.getAttribute('alt');
        
		
		if((alt != null) && (alt != undefined) && (alt != '')) {
			/* Try to unserialize validation data */
			try {
				eval("var responseObj = " + alt);
			} catch (e) {
				continue;
			}
			
			/* Trim whitespace */
			element.value = element.value.trim();
			var elementError = false;
			var errorMessage = "";
			
			/* Look for required field and required field error message */
			var required = false;
			if(responseObj['required'] != undefined) {
				required = responseObj['required'];
			}
			if(required) {
    			var requiredMessage = 'Required field';
    			if(responseObj['required_message'] != undefined) {
    				requiredMessage = responseObj['required_message'];
    			}
    			
    			if(element.value.length == 0) {
    				elementError = true;
    				errorMessage = requiredMessage;
    			}
			}
			
			/* Look for validators */
			if((!elementError) && (element.value.length > 0) && ((responseObj['group'] == null) || (check_group_validation(form, element, responseObj['group'])))) {
				for(var vCounter=0; vCounter<responseObj['validators'].length; vCounter++) {
					if(responseObj['validators'][vCounter]['class'] != undefined) {
						var className = responseObj['validators'][vCounter]['class'];
						/* try to create a validator object */
						try {
							eval('var validator = new '+className+'()');
						} catch (e) {
//							alert('Unknown validation class: '+className);
							continue;
						}
						
						/* Attache a standard initialization method */
						validator.initialize=function(parameters) {
							try {
								for(var parameter in parameters) {
									this[parameter] = parameters[parameter];
								}
							} catch(e) {}
						}
	
						/* Initialize parameters */
						validator.initialize(responseObj['validators'][vCounter]['parameters']);
						
						/* Validate */
						errorMessage = validator.execute(element.value);
						if(errorMessage) {
		    				elementError = true;
		    				break;
						}
					}
				}
			}
			
			/* Show/Hide alerts */
			var alertImg = document.getElementById(element.name+"Error");
			var divError = document.getElementById('div_error');
			
			if(elementError) {
				valid = false;
				try {
					element.style.backgroundColor='#00ffff' ;
					my_field_error(element, errorMessage);
				} catch (e) {
					if(alertImg) 
					{
						if ( divError )
							divError.style.display = 'block';
						alertImg.alt = errorMessage;
						alertImg.title = errorMessage;
						alertImg.style.display = 'inline';
					}
				}
			} else {
				try {
					element.style.backgroundColor='#FFFFFF' ;
					element.title=element.name ;
					my_field_error(element, null);
				} catch (e) {
					if(alertImg) {
						if ( divError )
							if ( !hay_errores(form) )
								divError.style.display = 'none';
   						alertImg.style.display = 'none';
					}
				}
			}
		}
		}// end if undefined
	} // end for
	
	// call any user's functionality after validation
	try {
		validate_shutdown();
	} catch (e) {
	}
	
	if(valid == false)
	{
     alert("Existen algunos errores en los datos suministrados en el formulario.");
    }
	
	return valid;
}

function hay_errores(form)
{
	var valid = false;
	var elements = new Array();

	if(form.tagName.toString().toLowerCase() == 'form') {
		var elements = form.getElementsByTagName('*');
	} else {
		elements[0] = form;
		while((form.tagName.toString().toLowerCase() != 'form') && (form.parentNode != null)) {
			form = form.parentNode;
		}
		if(form.tagName.toString().toLowerCase() != 'form') {
			elements = new Array();
		}
	}
	cont = 0;

	for(var eCounter = 0; eCounter < elements.length; eCounter++) 
	{
		var element = elements[eCounter];
		if(element.type != "" && String(element.type) != "undefined" && String(element.type) != "submit"  && String(element.type) != "button")
		{
			var alt = element.getAttribute('alt');
			if((alt != null) && (alt != undefined) && (alt != ''))
			{
			try {
				eval("var responseObj = " + alt);
			} catch (e) {
				continue;
			}
			
			element.value = element.value.trim();
			var elementError = false;
			var errorMessage = "";
			
			var required = false;
			if(responseObj['required'] != undefined) {
				required = responseObj['required'];
			}
			if(required) {
    			var requiredMessage = 'Required field';
    			if(responseObj['required_message'] != undefined) {
    				requiredMessage = responseObj['required_message'];
    			}
    			
    			if(element.value.length == 0) {
    				elementError = true;
    				errorMessage = requiredMessage;
    			}
			}
			
			if((!elementError) && (element.value.length > 0) && ((responseObj['group'] == null) || (check_group_validation(form, element, responseObj['group'])))) {
				for(var vCounter=0; vCounter<responseObj['validators'].length; vCounter++) {
					if(responseObj['validators'][vCounter]['class'] != undefined) {
						var className = responseObj['validators'][vCounter]['class'];
						try {
							eval('var validator = new '+className+'()');
						} catch (e) {
							continue;
						}
						
						validator.initialize=function(parameters) {
							try {
								for(var parameter in parameters) {
									this[parameter] = parameters[parameter];
								}
							} catch(e) {}
						}
	
						validator.initialize(responseObj['validators'][vCounter]['parameters']);
						errorMessage = validator.execute(element.value);
						if(errorMessage) {
		    				elementError = true;
		    				break;
						}
					}
				}
			}
			
			var alertImg = document.getElementById(element.name+"Error");
			var divError = document.getElementById('div_error');
			
			if(elementError)
			{
				valid = true;
				return valid;
			} else 
			{
				continue;
			}
		 }
		}// end if undefined
	} // end for
	
	return valid;
}

/*
* Se encarga de retornar el mensaje de error que tiena cada campo de error almacenado en la etiqueta alt de la imagen correspondiente.
* Esta para mostrarse en los tooltips.
* John R.Q.
*/
function menjaseError( imagenError )
{
	return imagenError.alt;
}



function check_group_validation(form, gElement, group) {
	var elements = form.getElementsByTagName('*');
	for(var eCounter = 0; eCounter < elements.length; eCounter++) {
		var element = elements[eCounter];
		/* Look for validation data */
		var alt = element.getAttribute('alt')
		if((alt != null) && (alt != undefined) && (alt != '')) {
			/* Try to unserialize validation data */
			try {
				eval("var responseObj = " + alt);
			} catch (e) {
				continue;
			}
			
			/* Trim whitespace */
			element.value = element.value.trim();
			
			if((element.value.length > 0) && (responseObj['group'] == group) && (element != gElement)) {
				return true;
			}
		}
	}
	
	return false;
}



/* Validators */

/**
 * sfDateValidator validas las fechas. Jhon R.Q. 2007
 *
 * Optional parameters:
 *  
 * compare:  	Fecha con la que se desea comparar la fecha ingresada por el usuario. Formato 'aaaa-mm-dd' o 'now' para la fecha actual
 * operator: 	Operador de coparcaion para el campo compare. Los valores permitidos son < # < <= > >= ==
 * date_error: 	Error mostrado en caso de que la fecha este mal ingresada
 * compare_between: 	Rango de fechas con las que se desea comparar la fecha ingresada por el usuario. Ej [2007-10-25, 2007-10-30]
 * operator_between: 	Operador de coparcaion para el rango de fechas. Valores permitidos [>, <=]  [>=, <] [>, <] [>=, <=]
 * compare_error:		Error mostrado en caso de que la comparacion falle
 * 
 */
var sfDateValidator=function() 
{
	this.operator= null;
    this.date_error= "Formato de fecha incorrecto";
    this.compare=  null;
    this.compare_between= null;
    this.operator_between= null;
    this.compare_error= "Las fecha no es valida";
}

sfDateValidator.prototype.execute=function(value)
{
     var Fecha= new String(value)   // Crea un string  
     var Dia= new String(Fecha.substring(Fecha.lastIndexOf("-")+1,Fecha.length))  
     var Mes= new String(Fecha.substring(Fecha.indexOf("-")+1,Fecha.lastIndexOf("-")))  
     var Ano= new String(Fecha.substring(0,Fecha.indexOf("-")))
     
     // Valido el a�o  
     if (isNaN(Ano) || Ano.length<4 || parseFloat(Ano)<1900)
		return this.date_error;
     
	//Valido el Mes  
     if (isNaN(Mes) || parseFloat(Mes)<1 || parseFloat(Mes)>12)	
     	return this.date_error;
     
     // Valido el Dia  
     if (isNaN(Dia) || parseInt(Dia, 10)<1 || parseInt(Dia, 10)>31)	
     	return this.date_error;
     
     if (Mes==4 || Mes==6 || Mes==9 || Mes==11 || Mes==2) 
     {
         if (Mes==2 && Dia > 28 || Dia>30)
			return this.date_error;
     }
    
     // Compara cuando una fecha es dada y un operador es dado para esa fecha
     //Jhon R.Q. 2007
    var compareDate = this.compare;
    if ( compareDate != null )
    {
      
      var operator = (this.operator!=null)? this.operator :  '==';
      
      var Fecha2= new String( compareDate )
      var Dia2= new String(Fecha2.substring(Fecha2.lastIndexOf("-")+1,Fecha2.length))  
      var Mes2= new String(Fecha2.substring(Fecha2.indexOf("-")+1,Fecha2.lastIndexOf("-")))  
      var Ano2= new String(Fecha2.substring(0,Fecha2.indexOf("-")))
     
      var value1 = new Date(Ano+"/"+Mes+"/"+Dia);
      var value2 = compareDate=="now"? new Date(): new Date(Ano2+"/"+Mes2+"/"+Dia2);
	  value2.setHours('0');
      value2.setMinutes('0');
      value2.setSeconds('0');
	 
      // If the check date is valid, compare it. Otherwise ignore the comparison
      if ( value2 != null )
      {
        var valid = false;
        switch ( operator)
        {
          case '>':
            valid = value1 > value2;
            break;
          case '>=':
            valid = value1 >= value2;
            break;
          case '<=':
            valid = value1 <= value2;
            break;
          case '<':
            valid = value1 < value2;
            break;
          case '==':
            valid = String(value1).trim() == String(value2).trim();
            break;
        }
        
        if ( !valid )
           return this.compare_error;
      }
    }
    
    //compara la fecha de entrada de acuerdo a un rango de fechas con sus respectivos operadores
    //Jhon R.Q. 2007
     var compareBetween = this.compare_between;
     if ( compareBetween!=null && compareBetween[0].trim()!="" && compareBetween[1].trim()!="" )
     {
     	  var operatorBetween = this.operator_between;
	      var operatorInicio =  operatorBetween[0]!=""? operatorBetween[0].trim() : ">=";
	      var operatorFin =  operatorBetween[1]!=""? operatorBetween[1].trim () : "<=";
	      var FechaInicio = compareBetween[0].trim();
	      var FechaFin = compareBetween[1].trim();
	
	      FechaInicio= new String( FechaInicio )
      	  var DiaInicio= new String(FechaInicio.substring(FechaInicio.lastIndexOf("-")+1,FechaInicio.length))  
      	  var MesInicio= new String(FechaInicio.substring(FechaInicio.indexOf("-")+1,FechaInicio.lastIndexOf("-")))  
      	  var AnoInicio= new String(FechaInicio.substring(0,FechaInicio.indexOf("-")))
      
      	  FechaFin= new String( FechaFin )
      	  var DiaFin= new String(FechaFin.substring(FechaFin.lastIndexOf("-")+1,FechaFin.length))  
      	  var MesFin= new String(FechaFin.substring(FechaFin.indexOf("-")+1,FechaFin.lastIndexOf("-")))  
      	  var AnoFin= new String(FechaFin.substring(0,FechaFin.indexOf("-")));
      	  
      	  var value1 = new Date(Ano+"/"+Mes+"/"+Dia);
	      var valueInicio = FechaInicio=="now"? new Date(): new Date(AnoInicio+"/"+MesInicio+"/"+DiaInicio); //new Date(AnoInicio+"/"+MesInicio+"/"+DiaInicio);
      	  var valueFin = FechaFin=="now"? new Date(): new Date(AnoFin+"/"+MesFin+"/"+DiaFin); //new Date(AnoFin+"/"+MesFin+"/"+DiaFin);
      	  valueInicio.setHours('0'); valueInicio.setMinutes('0'); valueInicio.setSeconds('0');
      	  valueFin.setHours('00'); valueFin.setMinutes('00'); valueFin.setSeconds('00');
      
	      //Realiza la comparacion entre las fechas
	      //Nota: Presenta un inconveniento al realizar la comparacion de la fecha final cuando el valor es now, el problema es que 
	      //no ejecuta correctamente el operardor <.
	      var valor = "valid  = ( ( value1"+operatorInicio+"valueInicio) && (value1"+operatorFin+"valueFin) );";
	      
	      eval ( valor );
	      if ( !valid )
	           return this.compare_error;
     }

     return false
}
	
	
/* Validators */

/**
 * sfStringValidator allows you to apply string-related constraints to a
 * parameter.
 *
 * Optional parameters:
 *
 * # insensitive  - [false]              - Whether or not the value check
 *                                                against the array of values is
 *                                                case-insensitive. Note:
 *                                                When using this option, values
 *                                                in the values array must be
 *                                                entered in lower-case.
 * # max          - [none]               - Maximum string length.
 * # max_error    - [Input is too long]  - An error message to use when
 *                                                input is too long.
 * # min          - [none]               - Minimum string length.
 * # min_error    - [Input is too short] - An error message to use when
 *                                                input is too short.
 * # values       - [none]               - An array of values the input
 *                                                is allowed to match.
 * # values_error - [Invalid selection]  - An error message to use when
 *                                                input does not match a value
 *                                                listed in the values array.
 */

/* Constructor */
var sfStringValidator=function() {
	this.insensitive = false;
	this.max = null;
	this.max_error = "Valor muy grande";
	this.min = null;
	this.min_error = "Valor muy peque&ntilde;o";
	this.values = null;
	this.values_error = "El valor no cumples las restricciones";
    this.type = null;
    this.type_error=  "El string contiene valores no permitidos"
    
}

/* Validation method */
sfStringValidator.prototype.execute=function(value) {
			    	
	if ((this.min != null) && (value.length < this.min)) {
		// too short
		return this.min_error;
	}

	if ((this.max != null) && (value.length > this.max)) {
		// too long
		return this.max_error;
	}
    
	//Para que solo acepte valores aldanumericos o caracteres segun sea el caso.
    //Determina si un string ingresado es ideal para una contrase�a
    //John R.Q. 2007
	var type = this.type;
	if ( type != null )
    switch ( type )
    {
    	case "alfanumerico":
        	valores_no_permitidos = new Array( "=", "&", "#", "/", "[", "~", "\", \"[", "]", "!", "@", "$", "%", "^", "&", "(", ")", "�", "?", "�", "�", "{", "}", ")", "/" );
			num_caracteres = value.length;
	        for (i=0; i<num_caracteres; i++)
	        {
            	CActual = value.charAt(i)
            	if ( valores_no_permitidos.toString().indexOf( CActual ) !==-1)
            		return this.type_error;
         	}
        break;
    	case "texto":
    		valores_no_permitidos = new Array( "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "=", "&", "#", "/", "[", "~", "\", \"[", "]", "!", "@", "$", "%", "^", "&", "(", ")", "�", "?", "�", "�", "{", "}", ")", "/" );
			num_caracteres = value.length;
	        for (i=0; i<num_caracteres; i++)
	        {
            	CActual = value.charAt(i)
            	if ( valores_no_permitidos.toString().indexOf( CActual ) !==-1)
            		return this.type_error;
         	}
         	
        break;
    	case "clave":
			numeros_requeridos = new Array( "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" );
			letras_requeridas = new Array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
			num_caracteres = value.length;

			for (i=0; i<num_caracteres; i++)
	        {
            	CActual = value.charAt(i)
            	if ( numeros_requeridos.toString().indexOf( CActual ) > -1)
            		break;
         	}

         	for (j=0; j<num_caracteres; j++)
	        {
            	CActual = value.charAt(j)
            	if ( letras_requeridas.toString().indexOf( CActual ) > -1)
            		break;
         	}
         	
         	if ( i >= num_caracteres || j >= num_caracteres)
         		return this.type_error;
        break;
    }
    
	if(this.values != null) {
		for(i = 0; i < this.values.length; i++) {
			if((this.insensitive?(this.values[i].toLowerCase()):(this.values[i])) == (this.insensitive?(value.toLowerCase()):(value))) {
				return false;
			}
		}
		
		return this.values_error;
	}

	return false;
}

/**
 * sfNumberValidator verifies a parameter is a number and allows you to apply
 * size constraints.
 *
 * Optional parameters:
 *
 * # max        - [none]                  - Maximum number size.
 * # max_error  - [Input is too large]    - An error message to use when
 *                                                 input is too large.
 * # min        - [none]                  - Minimum number size.
 * # min_error  - [Input is too small]    - An error message to use when
 *                                                 input is too small.
 * # nan_error  - [Input is not a number] - Default error message when
 *                                                 input is not a number.
 * # type       - [Any]                   - Type of number (Any, Float).
 * # type_error - [Wrong input] - An error message to use when
 *                                                 input is not a number.
 */

/* Constructor */
var sfNumberValidator=function() {
	this.max = null;
	this.max_error = "Valor muy largo";
	this.min = null;
	this.min_error = "Valor muy corto";
	this.nan_error = "Valor no es un n�mero";
	//this.type = "any"; // 'any', 'decimal', 'float', 'int', 'integer'
	this.type = null;//'any', 'decimal', 'float', 'int', 'integer';
	this.type_error = "Formato no permitido";
}

/* Validation method */
sfNumberValidator.prototype.execute=function(value) {
	
	//Se da formato al numero
	value = (value.split('.').join('')).split(',').join('.');

	if(isNaN(value)) {
		return this.nan_error;
	}
						
	iValue = parseInt(value, 10);
	fValue = parseFloat(value);
	
	if( (this.type == 'int') || (this.type == 'entero')) {
		if( String(fValue) != String(iValue) ) 
		{
			return this.type_error;
		}
		pValue = iValue;
	} else {
		pValue = fValue;
	}
	
	if((this.min != null) && (pValue < this.min)) {
		return this.min_error;
	}
	
	if((this.max != null) && (pValue > this.max)) {
		return this.max_error;
	}
	
	return false;
}

/**
 * sfRegexValidator allows you to match a value against a regular expression
 * pattern.
 *
 * Required parameters:
 *
 * # pattern - [none] - A PCRE, preg_match() style regular expression
 *                             pattern.
 *
 * Optional parameters:
 *
 * # match       - [true]          - Indicates that the pattern must be
 *                                          matched or must not match.
 * # match_error - [Invalid input] - An error message to use when the
 *                                          input does not meet the regex
 *                                          specifications.
 */

/* Constructor */
var sfRegexValidator=function() {
	this.match = true;
	this.match_error = "Invalid input";
	this.pattern = null;
}

/* Validation method */
sfRegexValidator.prototype.execute=function(value) {
	if(this.pattern != null) {
		match = Boolean(this.match);
		pos = 0;
		unescaped = "";
		while(pos < this.pattern.length) {
			c = this.pattern.charAt(pos);
			if (c == "\\") {
				pos++;
			}
			try {
				unescaped += this.pattern.charAt(pos);
			} catch(e) {}
			pos++;
		}

		try {		
			eval("regExp = "+unescaped);
			value = String(value);
			if((value.match(regExp) && match) || (!value.match(regExp) && !match)) {
				return false;
			} else {
				return this.match_error;
			}
		} catch(e) {
			return false;
		}
	} else {
		return false;
	}
}

/**
 * sfEmailValidator verifies a parameter contains a value that qualifies as an
 * email address.
 * 
 * Optional parameters:
 *
 * # email_error - [Invalid input] - An error message to use when the
 *                                          input is not an email address
 */

/* Constructor */
var sfEmailValidator=function() {
	this.email_error = "Formato de correo in correcto";
}

sfEmailValidator.prototype.execute=function(value) {
	regExp  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})$/;
	if (regExp.test(value)) {
		return false;
	} else {
		return this.email_error;
	}
}


/**
 * sfCompareValidator checks the equality of two different request parameters.
 *
 * Required parameters:
 *     check:          field2
 * 
 * Optional parameters:
 * # compare_error - [The values you entered do not match. Please try again.] - 
 *                           An error message to use when the fields do not match
 */

/* Constructor */
var sfCompareValidator=function()
{
	this.check = null;
	this.compare_error = "El valor ingresado no concuerda. Intente nuevamente.";
}

sfCompareValidator.prototype.execute=function(value) 
{
	if(this.check != null) {
		check_field = document.getElementById(this.check);
		if(check_field != null) {
			check_value = check_field.value;
			if(check_value != value) {
				return this.compare_error;
			}
		}
	}
	
	return false;
}

/*===============================================================================================================================*/
/*===============================================================================================================================*/

/* Validators */

/**
 * selfDateValidator valida el formato de las fechas y compara entre fechas. Jhon R.Q. 2007
 * 
 * form		referencia al formulario
 * name		nombre del campo que se requiere verificar
 * 			Generalmente es la fecha que ingresa el usuario por el formulario. Formato aaaa-mm-dd
 * required		Determina si es o no requerido la fecha
 * compare:  	Fecha con la que se desea comparar la fecha ingresada por el usuario. Formato aaaa-mm-dd
 * operator: 	Operador de comparcaion para el campo compare. Los valores permitidos son < # < <= > >= ==
 * compare_between: 	String, rango de fechas con las que se desea comparar la fecha ingresada por el usuario.
 						El formato es "aa-mm-dd:aa-mm-dd". Ej "2007-10-25:2007-10-30" para la fecha actual se usa 'now' Ej. "2007-01-01:now"
 * operator_between: 	String, operador de coparcaion para el rango de fechas. 
 						El formato es "operador:operador". Valores permitidos ">:<=" ">=:<" ">:<" ">=:<="
 * 
 */

selfDateValidator =function(form, name, required, compare, operator, compare_between, operator_between )
{
	 var elemento = eval("form."+name);
	 var respuesta = true;
	 value = elemento.value;
	 var divError = document.getElementById('div_error');

	 if ( value=='' && !required )
	 	respuesta=false;
	 if ( value=='' && required )
	 	respuesta=false;

	 if ( !respuesta )
     {
		elemento.style.backgroundColor='#ffe1e1';
		elemento.title = "La fecha es obligatoria";
	    document.getElementById(name+'Error').alt = elemento.title;
	    document.getElementById(name+'Error').style.display = 'inline';
	    if ( divError )
		  divError.style.display = 'block';
		return respuesta;
     }
     
	 var error =  "Formato de fecha incorrecta";
     var Fecha= new String(value)   // Crea un string  
     var Dia= new String(Fecha.substring(Fecha.lastIndexOf("-")+1,Fecha.length))  
     var Mes= new String(Fecha.substring(Fecha.indexOf("-")+1,Fecha.lastIndexOf("-")))  
     var Ano= new String(Fecha.substring(0,Fecha.indexOf("-")))
     
     // Valido el a�o
     if (isNaN(Ano) || Ano.length<4 || parseFloat(Ano)<1900)
		respuesta=false;		
	//Valido el Mes  
     if (isNaN(Mes) || parseFloat(Mes)<1 || parseFloat(Mes)>12)
		respuesta=false;
     // Valido el Dia 
     if (isNaN(Dia) || parseInt(Dia, 10)<1 || parseInt(Dia, 10)>31)	
		respuesta=false;
     if (Mes==4 || Mes==6 || Mes==9 || Mes==11 || Mes==2) 
     {
         if (Mes==2 && Dia > 28 || Dia>30)
			respuesta=false;
     }
	
     if ( !respuesta )
     {
     	elemento.style.backgroundColor='#ffe1e1';
		elemento.title = error;
	    document.getElementById(name+'Error').alt = elemento.title;
	    document.getElementById(name+'Error').style.display = 'inline';
	    if ( divError )
		  divError.style.display = 'block';
		return respuesta;
     }
     
     // Compara cuando una fecha es dada y un operador es dado para esa fecha
     //Jhon R.Q. 2007
    var compareDate =compare;
    if ( compareDate != null )
    {
      var operator = (operator!=null)? operator :  '==';
      
      var Fecha2= new String( compareDate )
      var Dia2= new String(Fecha2.substring(Fecha2.lastIndexOf("-")+1,Fecha2.length))  
      var Mes2= new String(Fecha2.substring(Fecha2.indexOf("-")+1,Fecha2.lastIndexOf("-")))  
      var Ano2= new String(Fecha2.substring(0,Fecha2.indexOf("-")))
     
      var value1 = new Date(Ano+"/"+Mes+"/"+Dia);
      var value2 = compareDate=="now"? new Date(): new Date(Ano2+"/"+Mes2+"/"+Dia2);
	  value2.setHours('0'); value2.setMinutes('0'); value2.setSeconds('0');
	 
      // If the check date is valid, compare it. Otherwise ignore the comparison
      if ( value2 != null )
      {
        var valid = false;
        switch ( operator)
        {
          case '>':
            respuesta = value1 > value2;
            break;
          case '>=':
            respuesta = value1 >= value2;
            break;
          case '<=':
            respuesta = value1 <= value2;
            break;
          case '<':
            respuesta = value1 < value2;
            break;
          case '==':
            respuesta = String(value1).trim() == String(value2).trim();
            break;          
        }
        
        if ( !respuesta )
        {
        	elemento.style.backgroundColor='#ffe1e1';
			elemento.title = "Error de comparac&oacute;n entre fechas";
		    document.getElementById(name+'Error').alt = elemento.title;
		    document.getElementById(name+'Error').style.display = 'inline';
		    if ( divError )
			  divError.style.display = 'block';
			return respuesta;
        }
      }
      if ( respuesta )
      {
      	elemento.style.backgroundColor='#ffffff';
	    elemento.title = name;
	  	document.getElementById(name+'Error').style.display = 'none';
	  	if ( divError )
			divError.style.display = 'none';
      }
      return respuesta;
    }
    
    //compara la fecha de entrada de acuerdo a un rango de fechas con sus respectivos operadores
    //Jhon R.Q. 2007
    
     if ( compare_between!=null )
     	var compareBetween = compare_between.split(":")
     
     if ( compareBetween!=null && compareBetween[0].trim()!="" && compareBetween[1].trim()!="" )
     {
     	  var operatorBetween = operator_between.split(":");
	      var operatorInicio =  operatorBetween[0]!=""? operatorBetween[0].trim() : ">=";
	      var operatorFin =  operatorBetween[1]!=""? operatorBetween[1].trim () : "<=";
	      var FechaInicio = compareBetween[0].trim();
	      var FechaFin = compareBetween[1].trim();
	
	      FechaInicio= new String( FechaInicio )
      	  var DiaInicio= new String(FechaInicio.substring(FechaInicio.lastIndexOf("-")+1,FechaInicio.length))  
      	  var MesInicio= new String(FechaInicio.substring(FechaInicio.indexOf("-")+1,FechaInicio.lastIndexOf("-")))  
      	  var AnoInicio= new String(FechaInicio.substring(0,FechaInicio.indexOf("-")))
      
      	  FechaFin= new String( FechaFin )
      	  var DiaFin= new String(FechaFin.substring(FechaFin.lastIndexOf("-")+1,FechaFin.length))  
      	  var MesFin= new String(FechaFin.substring(FechaFin.indexOf("-")+1,FechaFin.lastIndexOf("-")))  
      	  var AnoFin= new String(FechaFin.substring(0,FechaFin.indexOf("-")));
      	  
      	  var value1 = new Date(Ano+"/"+Mes+"/"+Dia);
	      var valueInicio = FechaInicio=="now"? new Date(): new Date(AnoInicio+"/"+MesInicio+"/"+DiaInicio);
      	  var valueFin = FechaFin=="now"? new Date(): new Date(AnoFin+"/"+MesFin+"/"+DiaFin);
          valueInicio.setHours('0'); valueInicio.setMinutes('0'); valueInicio.setSeconds('0');
      	  valueFin.setHours('00'); valueFin.setMinutes('00'); valueFin.setSeconds('00');
      
	      //Realiza la comparacion entre las fechas
	      //Nota: Presenta un inconveniento al realizar la comparacion de la fecha final cuando el valor es now, el problema es que 
	      //no ejecuta correctamente el operardor <.
	      var valor = "respuesta  = (( value1 "+operatorInicio+" valueInicio) && (value1 "+operatorFin+" valueFin));";
	      eval ( valor );
	      if ( !respuesta )
          {
        	elemento.style.backgroundColor='#ffe1e1';
			elemento.title = "Error de comparac&oacute;n entre fechas";
		    document.getElementById(name+'Error').alt = elemento.title;
		    document.getElementById(name+'Error').style.display = 'inline';
		    if ( divError )
			  divError.style.display = 'block';
			return respuesta;
          }
     }

     elemento.style.backgroundColor='#ffffff';
	 elemento.title = name;
	 document.getElementById(name+'Error').alt = elemento.title;
	 document.getElementById(name+'Error').style.display = 'none';
	 if ( divError )
		divError.style.display = 'none';
	 return respuesta;
}



/**
 * selfStringValidator valida el formato de un string
 * 
 * form		referencia al formulario
 * name		nombre del campo que se requiere verificar
 * type 		tipo de dato. Puede ser string, alfanumeric, password
 * min:  	Valor minimo del string
 * max: 	valor m�ximo del string
 * values	valores permitidos para el campo a comprovar. El formato es 'string1:string2:string3:...'
 * insensitive: 	En caso de ser true no compara minuscaluas ni mayuscular en caso de false compara que concuerde exactamente 
 *					con loa alguno de los valores de values
 */
selfStringValidator = function(form, name, type, min, max, values, insensitive )
{
	
	 var elemento = eval("form."+name);
	 var respuesta = true;
	 value = elemento.value;
	 var divError = document.getElementById('div_error');
	 
	 var error =  "String incorrecto";
    
	if ((min != null) && (value.length < min))
	{
      elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = "Valor ingresado muy corto";
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';		
	  return false;
    }

	if ((max != null) && (value.length > max)) 
	{
      elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = "Valor ingresado muy largo";
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return false;
    }
    
	//Para que solo acepte valores alfanumericos o caracteres segun sea el caso.
    //Determina si un string ingresado es ideal para una contrase�a
    //John R.Q. 2007
	if ( type != null )
    switch ( type )
    {
    	case "alfanumerico":
        	valores_no_permitidos = new Array( "=", "&", "#", "/", "[", "~", "\", \"[", "]", "!", "@", "$", "%", "^", "&", "(", ")", "�", "?", "�", "�", "{", "}", ")", "/" );
			num_caracteres = value.length;
	        for (i=0; i<num_caracteres; i++)
	        {
            	CActual = value.charAt(i)
            	if ( valores_no_permitidos.toString().indexOf( CActual ) !==-1)
            	{
            		error = "La cadena tiene valoers no permitidos";
            		respuesta = false;
            	}
         	}
        break;
    	case "texto":
    		valores_no_permitidos = new Array( "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "=", "&", "#", "/", "[", "~", "\", \"[", "]", "!", "@", "$", "%", "^", "&", "(", ")", "�", "?", "�", "�", "{", "}", ")", "/" );
			num_caracteres = value.length;
	        for (i=0; i<num_caracteres; i++)
	        {
            	CActual = value.charAt(i)
            	if ( valores_no_permitidos.toString().indexOf( CActual ) !==-1)
            	{
            		error = "La cadena solo debe contener texto con valores permitidos";
            		respuesta = false;
            	}
         	}
         	
        break;
    	case "clave":
			numeros_requeridos = new Array( "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" );
			letras_requeridas = new Array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
			num_caracteres = value.length;

			for (i=0; i<num_caracteres; i++)
	        {
            	CActual = value.charAt(i)
            	if ( numeros_requeridos.toString().indexOf( CActual ) > -1)
            		break;
         	}

         	for (j=0; j<num_caracteres; j++)
	        {
            	CActual = value.charAt(j)
            	if ( letras_requeridas.toString().indexOf( CActual ) > -1)
            		break;
         	}
         	
         	if ( i >= num_caracteres || j >= num_caracteres)
         		{
            		error = "Debe contener n�meros y letras";
            		respuesta = false;
            	}
        break;
    }
    if ( !respuesta )
    {
      elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = error;
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return respuesta;
    }
    
	if(values != null) 
	{
		values = values.split(':');
		for(i = 0; i < values.length; i++)
			if((insensitive?(values[i].toLowerCase()):(values[i])) == (insensitive?(value.toLowerCase()):(value)))
				break;
		
		if ( i>= values.length )
		  respuesta = false;
	}
	if ( !respuesta )
    {
      elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = "Valor no permitido";
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return respuesta;
    }
    
    elemento.style.backgroundColor='#ffffff';
	elemento.title = name;
	document.getElementById(name+'Error').alt = elemento.title;
	document.getElementById(name+'Error').style.display = 'none';
	if ( divError )
		divError.style.display = 'none';
	return respuesta;
}


/**
 * selfNumberValidator valida el formato de un n�mero
 * 
 * form		referencia al formulario
 * name		nombre del campo que se requiere verificar
 * type 		tipo de dato. Puede ser int, integer, float
 * min:  	Valor minimo del numero
 * max: 	valor m�ximo del numero
 */
selfNumberValidator = function(form, name, required, type, min, max )
{
	 var elemento = eval("form."+name);
	 var respuesta = true;
	 value = elemento.value;
	 var error =  "Valor no permitido";
	 var divError = document.getElementById('div_error');

	if ( required && value=='' )
	{
	  elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = "El valor es requerido";
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return false;
	}
	//Se da formato al numero
	value = (value.split('.').join('')).split(',').join('.');

	if(isNaN(value))
	{
      elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = error;
	  document.getElementById(name+'Error').alt = error;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return false;
    }

	iValue = parseInt(value, 10);
	fValue = parseFloat(value);
	
	if( (type == 'int') || (type == 'entero')) 
	{
		if( String(fValue) != String(iValue) ) 
		{
    	  elemento.style.backgroundColor='#ffe1e1';
		  elemento.title = "Valor no entero";
		  document.getElementById(name+'Error').alt = elemento.title;
	  	  document.getElementById(name+'Error').style.display = 'inline';
	  	  if ( divError )
			divError.style.display = 'block';		  
	  	  return false;
    	}
		pValue = iValue;
	} else {
		pValue = fValue;
	}
	
	if((min != null) && (pValue <min))
	{
      elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = "Valor muy peque&ntilde;o";
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return false;
    }
	
	if((max != null) && (pValue >max))
	{
      elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = "Valor muy grande";
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  return false;
	  if ( divError )
		divError.style.display = 'block';
	}
	
    elemento.style.backgroundColor='#ffffff';
	elemento.title = name;
	document.getElementById(name+'Error').alt = elemento.title;
	document.getElementById(name+'Error').style.display = 'none';
	  if ( divError )
		divError.style.display = 'none';
	return respuesta;
}



/**
 * selfEmailValidator valida el formato de un n�mero
 * 
 * form		referencia al formulario
 * name		nombre del campo que se requiere verificar
 * type 		tipo de dato. Puede ser int, integer, float
 * min:  	Valor minimo del numero
 * max: 	valor m�ximo del numero
 */

selfEmailValidator = function(form, name, required )
{
	 var elemento = eval("form."+name);
	 var respuesta = true;
	 value = elemento.value;
	 var error =  "Formato incorrecto para el e-mail";
	 var divError = document.getElementById('div_error');
	
	if ( required && value=='' )
	{
	  elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = "El valor es requerido";
	  document.getElementById(name+'Error').alt = elemento.title;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return false;
	}
	
	regExp  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})$/;
	if (regExp.test(value))
	{
		elemento.style.backgroundColor='#ffffff';
		elemento.title = name;
		document.getElementById(name+'Error').alt = '';
		document.getElementById(name+'Error').style.display = 'none';
		if ( divError )
			divError.style.display = 'none';
		return true;
	}
	else 
	{
	  elemento.style.backgroundColor='#ffe1e1';
	  elemento.title = error;
	  document.getElementById(name+'Error').alt = error;
	  document.getElementById(name+'Error').style.display = 'inline';
	  if ( divError )
		divError.style.display = 'block';
	  return false;
	}
}

